#ifndef __Q_BASIC_COMPILER_AST_H__
#define __Q_BASIC_COMPILER_AST_H__

enum MathOperator
{
    OPERATOR_ADD = 1, // +
    OPERATOR_SUB,     // -
    OPERATOR_MUL,     // *
    OPERATOR_DIV,     // /
    OPERATOR_MOD,     // % , MOD
    OPERATOR_POWER,   // ^

    OPERATOR_EQUL,        // == , =
    OPERATOR_NOTEQUL,     // <> , >< , != as in basic
    OPERATOR_LESS,        // <
    OPERATOR_LESSEQU,     // <=
    OPERATOR_GREATER,     // >
    OPERATOR_GREATEREQUL, // >=
};

enum Linkage
{
    STATIC = 1, // 静态函数，无导出.
    EXTERN,     // 导出函数.
    IMPORTC,    // 导入C函数，这样就可以使用 C 函数调用了，算是我提供的一个扩展吧.
};

enum ReferenceType
{
    BYVALUE, // 传值.
    BYREF,   // 引用，实质就是指针了. 函数的默认参数是传引用.
};

class CodeBlockAST;
class FunctionDimAST;
// 逐层传递 给各个 virtual 操作, 虽然很大, 但是不传指针, 直接传值.
class ASTContext
{
  public:
    ASTContext()
        : llvmfunc(0), codeblock(0), block(0), func(0)
    {
    }

    llvm::Function *llvmfunc; // 当前的函数位置.
    CodeBlockAST *codeblock;  // 当前的代码块位置, 用于符号表.
    llvm::BasicBlock *block;  // 当前的插入位置.
    llvm::Module *module;     // 模块.
    FunctionDimAST *func;
};

// allow us to use shared ptr to manage the memory
class AST // :public boost::enable_shared_from_this<AST>
{
  public:
    AST();
    virtual ~AST() = 0; // use pure virtual deconstruction
  private:
    AST(const AST &);
    AST &operator=(const AST &);
};

#endif
